package Proj_pack;

import java.util.ArrayList;

public class Knoten {

	private final int id;
	private final int capacity;
	private Mash mash;

	private ArrayList<Integer> nachfolger;
	private ArrayList<Knoten> vorganger;

	public Knoten(int id, int cap) {
		this.id = id;
		this.capacity = cap;
		nachfolger = new ArrayList<Integer>(1);
		vorganger = new ArrayList<Knoten>(1);
	}

	public synchronized void addNf(Knoten nf) {
		// if (nf==null)throw new IllegalArgumentException("nachfolger null");
		this.nachfolger.add(nf.getId());
	}

	public synchronized void addPre(Knoten vg) {
		// if (vg==null)throw new IllegalArgumentException("vorganger null");
		this.vorganger.add(vg);
	}

	public int getId() {
		return id;
	}

	public int getCapacity() {
		return capacity;
	}

	public synchronized Mash getMash() {
		return mash;
	}

	// public synchronized Mash tryGetMash() {
	// if(!mash.lock.tryLock()){
	//
	// //da wir mit dem ganzen spliter abbrechen wenn wir das lock auf preMash
	// nicht kriegen, versuchen wirs lieber noch ein zweites mal.
	// if(mash.lock.tryLock()){
	// return mash;
	// }else {
	// return null;
	// }
	// }else{
	// return mash;
	// }
	// }

	public synchronized Mash tryGetMash() {
		if (mash == null) {
			return null;
		}
		if (mash.lock.tryLock()) {
			// System.err.println("ret mash" + mash);
			return mash;
		} else {
			return null;
		}
	}

	public synchronized void setMash(Mash mash) {

		// if (mash!=null){
		mash.lock.lock();
		try {

			this.mash = mash;
		} finally {
			mash.lock.unlock();
		}
		// }else{
		// this.mash=null;
		// }
	}

	public boolean zeigtAufSplitter(int[] spliter) {
		for (int kId : nachfolger) {
			for (int i = 0; i < spliter.length; i++) {
				if (spliter[i] == kId)
					return true;
			}
		}
		return false;
	}

	public synchronized void changeMash(Mash mashtarget) {
		mashtarget.lock.lock();
		try {
			Mash orig = mash;
			orig.lock.lock();
			try {
				this.mash.removeKnoten(this);
				mashtarget.add(this);
			} finally {
				orig.lock.unlock();
			}
		} finally {
			mashtarget.lock.unlock();
		}
	}

	public ArrayList<Knoten> getVorganger() {
		return vorganger;

	}

	public ArrayList<Integer> getNachfolger() {
		return nachfolger;
	}

	public synchronized String toString() {
		StringBuffer sb = new StringBuffer();
		sb.append("[ >" + id + "< " + capacity + " (vor: ");
		for (Knoten k : vorganger) {
			sb.append(" " + k.getId() + " ");
		}
		sb.append(") (nach: ");
		for (int kId : nachfolger) {
			sb.append(" " + kId + " ");
		}

		sb.append(")]");
		return sb.toString();
	}

	// @Override
	// public int hashCode() {
	// final int prime = 31;
	// int result = 1;
	// result = prime * result + capacity;
	// result = prime * result + id;
	// return result;
	// }
	//
	// @Override
	// public boolean equals(Object obj) {
	// if (this == obj)
	// return true;
	// if (obj == null)
	// return false;
	// if (getClass() != obj.getClass())
	// return false;
	// Knoten other = (Knoten) obj;
	// if (capacity != other.capacity)
	// return false;
	// if (id != other.id)
	// return false;
	// return true;
	// }

}
